#include "analysis.h"

// analysisStream(Analysis_Struct analysis_str, )

// typedef struct  __EVENT_DRIVE
// {
// 	MODE_TYPE mod;//消息的发送模块
// 	EVENT_TYPE event;//消息类型
// 	STATUS_TYPE status;//自身状态
// 	EVENT_FUN eventfun;//此状态下的处理函数指针
// }EVENT_DRIVE;

// EVENT_DRIVE eventdriver[] =
// //这就是一张表的定义，不一定是数据库中的表。也可以使自己定义的一个结构体数组。
// {
// 	{MODE_A, EVENT_a, STATUS_1, fun1}
// 	{MODE_A, EVENT_a, STATUS_2, fun2}
// 	{MODE_A, EVENT_a, STATUS_3, fun3}
// 	{MODE_A, EVENT_b, STATUS_1, fun4}
// 	{MODE_A, EVENT_b, STATUS_2, fun5}

// 	{MODE_B, EVENT_a, STATUS_1, fun6}
// 	{MODE_B, EVENT_a, STATUS_2, fun7}
// 	{MODE_B, EVENT_a, STATUS_3, fun8}
// 	{MODE_B, EVENT_b, STATUS_1, fun9}
// 	{MODE_B, EVENT_b, STATUS_2, fun10}
// };

// int driversize = sizeof(eventdriver) / sizeof(EVENT_DRIVE)//驱动表的大小

// EVENT_FUN GetFunFromDriver(MODE_TYPE mod, EVENT_TYPE event, STATUS_TYPE
// status)//驱动表查找函数
// {
// 	int i = 0;
// 	for (i = 0; i < driversize; i ++)
// 	{
// 		if ((eventdriver[i].mod == mod) && (eventdriver[i].event ==
// event)
// && (eventdriver[i].status == status))
// 		{
// 			return eventdriver[i].eventfun;
// 		}
// 	}
// 	return NULL;
// }

// 假设协议内容为：头部、文件分块号（16位）、功能位、内容长度（16位）、文件体（可变）、crc校验码、文件尾部
// crc校验码除了头部、尾部以及crc自身，其他全检验
typedef struct {
    FileNo_t file_no;
    Fn_t fn;
    FileLength_t length;
    FileBody_ptr body;
} FrameContent;

typedef struct _file_spilt_info_list {
    FileSpiltInfo *file_spilt_info;
    struct _file_spilt_info_list *next;
} FileSpiltInfoList;

RetCode_t AddFileSpiltInfoList(FileSpiltInfoList list, FileSpiltInfo *file_spilt_info) {
    list.next = (FileSpiltInfoList *)calloc(1, sizeof(FileSpiltInfoList));
    if (list.next == NULL) {
        return CALLOC_ERR;
    }
    list.next->file_spilt_info = file_spilt_info;
    return SUCCESS;
}

RetCode_t FreeFileSpiltInfoList(FileSpiltInfoList list, FileSpiltInfo file_spilt_info) {
    return SUCCESS;
}
/*
该子程序将一段流作为输入，并且分析该流的内容，从中剖离出
与相应协议相关的内容，存入至相关的结构体中
*/
RetCode_t AnalysisStream(Stream_ptr i_stream, const uint16_t i_streamLength, FileInfo *file_info) {
    /*
       声明帧内容存储结构体
       声明错误码并且初始化为 SUCCESS
       while 未到流尾部
        if （检测到头部）{
           读取并且储存功能号
           判断功能号
              if（功能号为FN_FILE--即帧内容为文件）{
                  读取并储存流分块号
                  读取并文件长度
                  if（文件长度在合理范围内）{
                      读出流并储存
                      读取并且储存crc校验码
                      进行crc校验
                      if（crc校验通过）{
                          储存文件内容
                          返回成功码
                      }else{
                          错误码置为 crc校验失败码
                      }
                  }else{
                    错误码置为带外错误码
                  }
              }else if（功能号为 FN_MD5）{
                  if（文件长度在合理范围内）{
                      储存md5校验信息
                  }
              }
        }else{
            该帧不完整，抛弃该帧，错误码置为 帧错误码
        }
        返回错误码
    */
}
